package com.dingwei.lesyndrome.ui.activity;


import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.NestedScrollView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.bumptech.glide.Glide;
import com.dingwei.lesyndrome.R;
import com.dingwei.lesyndrome.adapter.PeripheryAdapter;
import com.dingwei.lesyndrome.adapter.RecommendAdapter;
import com.dingwei.lesyndrome.app.MyApplication;
import com.dingwei.lesyndrome.bean.MainBean;
import com.dingwei.lesyndrome.mvp.presenter.MainPresenter;
import com.dingwei.lesyndrome.mvp.view.Contract;
import com.jaeger.library.StatusBarUtil;
import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter;
import com.lihao.baselibrary.base.BaseActivity;
import com.lihao.baselibrary.utils.L;
import com.lihao.baselibrary.utils.T;

import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
 * Created time 2018/2/26.
 * Creator 南柯一梦丶 on
 * Personal signature 余生还长 何必慌张
 * Page description : 主页
 */
public class MainActivity extends BaseActivity implements Contract.MainView {
    MainPresenter mainPresenter = new MainPresenter(this);


    @Bind(R.id.tv_location)
    TextView mTvLocation;
    @Bind(R.id.search_layout)
    LinearLayout mSearchLayout;
    @Bind(R.id.type_recyclerView)
    RecyclerView mTypeRecyclerView;
    @Bind(R.id.periphery_recyclerView)
    RecyclerView mPeripheryRecyclerView;

    @Bind(R.id.img_login)
    ImageView imgLogin;
    @Bind(R.id.ll_social_circle)
    LinearLayout llSocialCircle;
    @Bind(R.id.ll_coach)
    LinearLayout llCoach;
    @Bind(R.id.ll_news)
    LinearLayout llNews;
    @Bind(R.id.data_layout)
    RelativeLayout dataLayout;
    @Bind(R.id.no_net_btn)
    TextView noNetBtn;
    @Bind(R.id.ll_title)
    LinearLayout llTitle;
    @Bind(R.id.no_net_layout)
    RelativeLayout noNetLayout;
    @Bind(R.id.scrollView)
    NestedScrollView scrollView;
    @Bind(R.id.rl_img)
    RelativeLayout rlImg;
    private BDLocation location;

    PeripheryAdapter mPeripheryAdapter;
    RecommendAdapter mRecommendAdapter;
    public LocationClient mLocationClient = null;
    public MyLocationListener myListener = new MyLocationListener();


    @Override
    protected int getContentViewId() {

        return R.layout.activity_main;
    }


    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void initView() {

        mLocationClient = new LocationClient(getApplicationContext());
        //声明LocationClient类
        mLocationClient.registerLocationListener(myListener);
        //注册监听函数

        setLocationOptions();

        if (BaseActivity.value.getIsLogin()) {
            Glide.with(BaseActivity.context)
                    .load(BaseActivity.value.getheadImg())
                    .apply(MyApplication.headOptions)
                    .into(imgLogin);
        } else {
            imgLogin.setImageResource(R.drawable.pic8);
        }


        StatusBarUtil.setTranslucentForImageView(this, 30, null);
        LinearLayoutManager layoutManager = new LinearLayoutManager(context);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        mTypeRecyclerView.setLayoutManager(layoutManager);
        mTypeRecyclerView.setNestedScrollingEnabled(false);
        mRecommendAdapter = new RecommendAdapter(BaseActivity.context);
        mTypeRecyclerView.setAdapter(mRecommendAdapter);

        layoutManager = new LinearLayoutManager(context);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        mPeripheryRecyclerView.setLayoutManager(layoutManager);
        mPeripheryRecyclerView.setNestedScrollingEnabled(false);
        mPeripheryAdapter = new PeripheryAdapter(BaseActivity.context);
        mPeripheryRecyclerView.setAdapter(mPeripheryAdapter);


        llTitle.getBackground().mutate().setAlpha(0);
        scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (rlImg != null && rlImg.getHeight() > 0) {
                    int height = rlImg.getHeight();
                    if (scrollY < height) {
                        int alpha = (int) (new Float(scrollY) / new Float(height) * 200);
                        Log.e("yy", "" + alpha);
                        llTitle.getBackground().mutate().setAlpha(alpha);
                    } else {
                        llTitle.getBackground().mutate().setAlpha(255);
                    }
                }
            }
        });

        mRecommendAdapter.setOnItemClickListener(new RecyclerArrayAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                MainBean.DataBean.PerCateListBean bean = mRecommendAdapter.getItem(position);
                intent = new Intent(BaseActivity.context,SelectedMerchantsActivity.class);
                intent.putExtra("id",bean.id);
                intent.putExtra("title",bean.name);
                startActivity(intent);
            }
        });
        mPeripheryAdapter.setOnItemClickListener(new RecyclerArrayAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                MainBean.DataBean.PeripheryListBean bean = mPeripheryAdapter.getItem(position);
                intent = new Intent(BaseActivity.context,PeripheralDetailActivity.class);
                intent.putExtra("id",bean.id);

                startActivity(intent);
            }
        });

    }

    @Override
    protected void onResume() {
        super.onResume();
        if (BaseActivity.value.getIsLogin()) {
            Glide.with(BaseActivity.context)
                    .load(BaseActivity.value.getheadImg())
                    .apply(MyApplication.headOptions)
                    .into(imgLogin);
        } else {
            imgLogin.setImageResource(R.drawable.pic8);
        }
    }

    @Override
    protected void initData() {
        mLocationClient.start();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // TODO: add setContentView(...) invocation
        ButterKnife.bind(this);
    }

    @OnClick({R.id.img_login, R.id.ll_social_circle, R.id.ll_coach, R.id.ll_news, R.id.no_net_btn})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.img_login:
                if (BaseActivity.value.getIsLogin()) {
                    intent = new Intent(BaseActivity.context, PersonalCenterActivity.class);
                    startActivity(intent);
                } else {
                    intent = new Intent(BaseActivity.context, LoginActivity.class);
                    startActivity(intent);
                }
                break;
            case R.id.ll_social_circle:
                intent = new Intent(BaseActivity.context, GamCircleActivity.class);
                startActivity(intent);
                break;
            case R.id.ll_coach:
                intent = new Intent(BaseActivity.context, CoachTimetableActivity.class);
                startActivity(intent);
                break;
            case R.id.ll_news:
                intent = new Intent(BaseActivity.context, NewsActivity.class);
                startActivity(intent);
                break;
            case R.id.no_net_btn:
                mLocationClient.start();
                break;
        }
    }

    @Override
    public void setData(MainBean bean) {
        showData("success");

        mRecommendAdapter.clear();
        mRecommendAdapter.addAll(bean.data.perCateList);
        mPeripheryAdapter.clear();
        mPeripheryAdapter.addAll(bean.data.peripheryList);


    }

    @Override
    public void onFail() {
        showData("fail");
    }

    public void showData(String state) {
        if (state.equals("success")) {
            dataLayout.setVisibility(View.VISIBLE);
            noNetLayout.setVisibility(View.GONE);
        } else {
            dataLayout.setVisibility(View.GONE);
            noNetLayout.setVisibility(View.VISIBLE);
        }
    }

    public void setLocationOptions() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选，默认高精度，设置定位模式，高精度，低功耗，仅设备

//        option.setCoorType("bd09ll");
        //可选，默认gcj02，设置返回的定位结果坐标系

        int span = 0;
        option.setScanSpan(span);
        //可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的

        option.setIsNeedAddress(true);
        //可选，设置是否需要地址信息，默认不需要

        option.setOpenGps(true);
        //可选，默认false,设置是否使用gps

        option.setLocationNotify(true);
        //可选，默认false，设置是否当GPS有效时按照1S/1次频率输出GPS结果

        option.setIsNeedLocationDescribe(true);
        //可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”

        option.setIsNeedLocationPoiList(true);
        //可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到

        option.setIgnoreKillProcess(false);
        //可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死

        option.SetIgnoreCacheException(false);
        //可选，默认false，设置是否收集CRASH信息，默认收集

        option.setEnableSimulateGps(false);
        //可选，默认false，设置是否需要过滤GPS仿真结果，默认需要


        mLocationClient.setLocOption(option);
    }

    class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //获取定位结果
            StringBuffer sb = new StringBuffer(256);

            sb.append("time : ");
            sb.append(location.getTime());    //获取定位时间

            sb.append("\nerror code : ");
            sb.append(location.getLocType());    //获取类型类型

            sb.append("\nlatitude : ");
            sb.append(location.getLatitude());    //获取纬度信息

            sb.append("\nlontitude : ");
            sb.append(location.getLongitude());    //获取经度信息

            sb.append("\nradius : ");
            sb.append(location.getRadius());    //获取定位精准度

            if (location.getLocType() == BDLocation.TypeGpsLocation) {

                // GPS定位结果
                sb.append("\nspeed : ");
                sb.append(location.getSpeed());    // 单位：公里每小时

                sb.append("\nsatellite : ");
                sb.append(location.getSatelliteNumber());    //获取卫星数

                sb.append("\nheight : ");
                sb.append(location.getAltitude());    //获取海拔高度信息，单位米

                sb.append("\ndirection : ");
                sb.append(location.getDirection());    //获取方向信息，单位度

                sb.append("\naddr : ");
                sb.append(location.getAddrStr());    //获取地址信息

                sb.append("\ndescribe : ");
                sb.append("gps定位成功");

            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {

                // 网络定位结果
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());    //获取地址信息

                sb.append("\noperationers : ");
                sb.append(location.getOperators());    //获取运营商信息

                sb.append("\ndescribe : ");
                sb.append("网络定位成功");

            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {

                // 离线定位结果
                sb.append("\ndescribe : ");
                sb.append("离线定位成功，离线定位结果也是有效的");

            } else if (location.getLocType() == BDLocation.TypeServerError) {

                sb.append("\ndescribe : ");
                sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");

            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {

                sb.append("\ndescribe : ");
                sb.append("网络不同导致定位失败，请检查网络是否通畅");
                T.showShort(getApplicationContext(), "网络不通导致定位失败，请检查网络是否通畅");

            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {

                sb.append("\ndescribe : ");
                sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");

            }

            sb.append("\nlocationdescribe : ");
            sb.append(location.getLocationDescribe());    //位置语义化信息

            List<Poi> list = location.getPoiList();    // POI数据
            if (list != null) {
                sb.append("\npoilist size = : ");
                sb.append(list.size());
                for (Poi p : list) {
                    sb.append("\npoi= : ");
                    sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
                }
            }
            Log.i("location", sb.toString());
            Message msg = new Message();
            msg.obj = location;
            handler.sendMessage(msg);
        }
    }


    Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (mLocationClient.isStarted()){
                mLocationClient.stop();
            }
            location = (BDLocation) msg.obj;
            mTvLocation.setText(location.getDistrict());
            mainPresenter.initData(location.getLatitude()+"",location.getLongitude()+"");
            return false;
        }
    });
}
